<script>
    // 单列所以 与  符合索引

            /*
                    简单来说， "单列索引" 与 "多列索引（复合索引）" 最核心的区别在于它们优化查询的方式和能力不同。

                    单列索引只对单个列的查询有效,而多列索引则像是一个“联合目录”，对多列的组合查询更高效。

                    下面我们来详细分解它们的区别：
            */

            /*
                一、单列索引

                            单列索引是基于表中单个列创建的索引。

                            1、工作原理

                                    类似于一本教科书最后的单一术语索引。如果你想快速找到所有提到“EF Core”的页面，这个索引非常有效。

                            2、适用场景：

                                    ①、WHERE 子句中只涉及到该列的查询。

                                    ②、对该列进行 ORDER BY 排序的查询。

                                    eg:
                                            // 创建单列索引
                                                modelBuilder.Entity<Blog>()
                                                    .HasIndex(b => b.Url);

                                            sql:  
                                                    --- 以下查询能够有效利用该索引----

                                                    SELECT * FROM Blogs WHERE Url = 'https://example.com';
                                                    SELECT * FROM Blogs ORDER BY Url;
                                                    SELECT * FROM Blogs WHERE Url LIKE 'https://%';
            */

            /*
                二、多列索引 (复合索引)

                            多列索引是基于表中两个或多个列创建的索引。     列的顺序至关重要。 
                            
                            1、工作原理：

                                    类似于一个联合目录，例如先按“国家”排序，再按“城市”排序。如果你想找“中国-北京”的记录，它非常快。

                                    但如果你直接想找所有叫“北京”的城市（无论哪个国家），这个目录就没什么用了。

                            2、适用场景：

                                    ①、WHERE 子句中同时涉及多列的查询。

                                    ②、需要对多列进行组合排序的查询 (ORDER BY col1, col2)

                                    ③、查询只涉及到索引中的列（覆盖索引），无需回表查询数据行，性能极高。

                            3、关键规则：
                                     
                                    这是理解复合索引最重要的概念。

                                    数据库只能使用索引从 "最左边的列开始"的 "连续部分"。

                                    例如：

                                        我们创建一个复合索引 IX_Blogs_AuthorId_PublishedDate。

                                        modelBuilder.Entity<Blog>()
                                                .HasIndex(b => new { b.AuthorId, b.PublishedDate });

                                        下表分析了不同查询条件能否利用该索引：

                                            查询条件                                                         是否使用索引？                原因

                                        ①、WHERE AuthorId = 5 AND PublishedDate > '2023-01-01'                      是                  完全匹配索引列

                                        ②、WHERE AuthorId = 5                                                       是                  只匹配了索引的第一列AuthorId

                                        ③、WHERE PublishedDate > '2023-01-01'                                     通常否                没有从最左侧AuthorID开始。就像直接翻电话簿找叫“明”的人，而不是先找“张”姓

                                        ④、WHERE AuthorId = 5 AND Title = 'Hello'                                 部分使用               只能使用到 AuthorId 这部分索引，然后需要对 Title 进行过滤。

                                        ⑤、ORDER BY AuthorId, PublishedDate                                         是                  索引本身已经按这个顺序排好，可以直接用于排序。

                                        ⑥、ORDER BY PublishedDate                                                   否                  没有从最左列开始。
            */

            /*
                三、核心区别总结表：

                                特性	    单列索引	                        多列索引（复合索引）

                                索引列数	1列	                                多列（≥2）

                                核心概念	对单一字段做优化	                 对字段的组合进行优化，列顺序是关键

                                适用查询	针对该列的 WHERE, ORDER BY, JOIN	 针对从左到右列组合的 WHERE 和 ORDER BY

                                优势	    简单，对单一条件查询高效	        对多条件组合查询效率极高，可实现覆盖索引

                                劣势	    无法优化多条件查询	                设计更复杂，必须遵循最左前缀原则，否则无效

                                类比	    教科书后的单一术语索引	             电话簿（先按姓排序，再按名排序）
            */

            /*
                四、实践建议

                            1、高选择性原则：

                                            将选择性更高（唯一值更多）的列放在复合索引的左边。例如，(Country, City) 比 (City, Country) 更好，因为“国家”的数量远少于“城市”。

                            2、WHERE 优先于 ORDER BY：如果查询既有过滤(WHERE)又有排序(ORDER BY)，优先保证过滤条件能用上索引。

                            3、避免过度索引：    索引会降低写入（INSERT, UPDATE, DELETE）速度并占用空间。
                                               只为最常用和最关键查询创建索引。

                            4、分析查询模式：
                                            使用 SQL Server Profiler、EF Core 的日志记录或数据库的慢查询日志来识别哪些查询真正需要被优化，然后为之创建合适的索引。



                    ★、结论：

                                单列索引是基础工具，而多列索引是应对复杂查询的强大高级工具。

                                正确设计复合索引是数据库性能优化的关键一步，其核心在于理解并应用最左前缀匹配原则。
            */
</script>